package demo1;


public class Test {
    public static void main1(String[] args) {
        String str1 = "hello";
        String str2 = "小美";
        String str3 = new String("hello");
        //为什么这里的赋值字符串 -->"hello"<----也是一个对象,它不是放在常量池当中吗
        String str4 = new String();
        System.out.println(str4);
        char[] ch = {'a','x','s','x'};
        String str5 = new String(ch);
        System.out.println(str5);

        //String 是一个引用变量，并不直接存储字符串本身
        //value是一个数组，指向内存当中数组，但是字符串常量池又是什么回事

        System.out.println(str1.length());
        //字符串求长度是方法  数组长度是属性

        System.out.println(str2.isEmpty());
        //判空-->指向的对象的字符元素为不为0  不会空指针异常，因为引用确实指向了一个对象，但是对象里面的字符个数为0
        System.out.println(str4.length());
        String str6 = null;
        //空指针，str6不指向任何对象


    }

    public static void main2(String[] args) {
        //在java当中，双引号引起来的也是字符串类型  字符串常量
        System.out.println("hahax".length());

        //字符串对象的比较
        //字符串的比较有两种场景
        // 相同 .equals  比较两个引用指向的对象当中的字符数组的内容是否是一致的
        // 大小 .compareto 比较字符串每一位的字符的大小，一旦发现不相等，立即返回这两个不相等的字符的差值
        //字符串前面都相等，但是字符个数不一样，则字符数组个数大的比较长，返回相差的字符个数
        //ctrl B 快捷键跳到方法源码

        ///忽略大小写比较   compareTOIgnoreCase  忽略大小写
        //汉字没有大小写


        String str1 = "haha";
        String str2 = "haha";
        String str3 = "hahehhhhhh";
        String str4 = "hahehhh";
        System.out.println(str1.equals(str2));
        System.out.println(str1.compareTo(str2));
        System.out.println(str3.compareTo(str4));
        //忽略大小写
        System.out.println(str3.compareToIgnoreCase(str4));
        System.out.println(str3.equalsIgnoreCase(str4));

    }

    public static void main3(String[] args) {
        //在字符串当中查找  charAt  有多个重载方法
        //1---charAt  从字符串当中拿到指定位置的字符  (字符串也默认从0开始编号)
        //2---charAt
        //3---charAt
        String str1 = "hahahha";
        char ch = str1.charAt(3);
        System.out.println(ch);
        for (int i = 0; i < str1.length(); i++) {
            System.out.println(str1.charAt(i));
        }
        //返回字符第一次出现的位置--》indexOf 也是从0开始编号
        //indexOf(char ch，int fromindex) 从指定位置开始查找
        //indexOf（String）  返回字符串第一次出现的位置 查找子串  也可以从指定位置后开始查找
        //lastIndexOf  从后面开始往前查找第一次出现的位置
        //lastIndexOf 也可以指定位置开始往前查找（正序：是从0开始往后找，这个是从最后开始往前找）
        System.out.println(str1.indexOf('a'));
        System.out.println(str1.indexOf("haha"));
        //从编号为号的位置开始查找 （编号为6的位置也是包含在查找范围内的）
//        System.out.println(str1.indexOf("haha",6));

        System.out.println(str1.lastIndexOf('a'));
        System.out.println(str1.lastIndexOf("haha"));
        System.out.println(str1.lastIndexOf("haha",2));
        System.out.println(str1.lastIndexOf('a',4));


    }

    public static void main4(String[] args) {
        //字符串转换

        //其他类型转字符串 valueOf
        String str1 = String.valueOf(12.33421);
        String str2 = String.valueOf(123);
        System.out.println(str1);
        System.out.println(str2);

        String str3 = String.valueOf(new Person("小美"));
        System.out.println(str3);

        //字符串转数字
        String str4 = "124322";
        System.out.println(Integer.parseInt(str4));

        String str5 = "13.223";
        System.out.println(Double.parseDouble(str5));

        //基本类型也提供了面向对象的思想

    }

    public static void main5(String[] args) {

        //大小写转换  ---只会转换字母大小写
        String str1 = "abcd";
        String str2 = "ABCD";
        System.out.println(str1.toUpperCase());
        System.out.println(str2.toLowerCase());
    }

    public static void main6(String[] args) {
        //字符串转数组

        String str1 = "asws";
        System.out.println(str1.toCharArray());

        String str2 = "我爱小美";
        System.out.println(str2.toCharArray());
    }

    public static void main7(String[] args) {
        //格式化
        String s = String.format("%d---%d---%d",1023,23,23);
        System.out.println(s);
        String str1 = String.format("%f",232.23);
        System.out.println(str1);
    }

    public static void main8(String[] args) {
        //字符串替换

        //replace  将指定字符全部替换掉  或者将指定字符串替换掉
        String str1 = "sddcAAAcdfAAA";
        String str2 = str1.replace('A','s');
        System.out.println(str1);
        System.out.println(str2);
        String str3 = str1.replace("A","000");
        System.out.println(str3);

        //replaceAll 和replace都一样

        String str4 = str1.replaceFirst("A","999");
        String str5 = str1.replaceAll("A","999");
        System.out.println(str4);
        System.out.println(str5);


        //字符串的操作都是在新字符串上操作的，对原字符串无影响
    }

    public static void main9(String[] args) {
        //字符串拆分  将指定字符串按照指定分隔符分割9
        //split的参数一档是字符串，不是字符
        //split还可以指定最小分割字符个数  指定个数进行分割，先按照
        // 不指定数分割，当数量一定后，就不分割，剩下的直接当一个字符串

        String str1 = "hello   little bitter";
        String[] strs1 = str1.split(" ");
        String[] strs2 = str1.split(" ",2);
        System.out.println(strs1.toString());

        for (int i = 0; i < strs1.length; i++) {
            System.out.println(strs1[i]);
        }
        for (int i = 0; i < strs2.length; i++) {
            System.out.println(strs2[i]);
        }
    }

    public static void main10(String[] args) {

        //字符串分割的转移字符  遇到一些符号需要对其进行转义
        String str1 = "1323.232.2231";
        String[] strs1 = str1.split("\\.");
    }
    //指定对个分隔符可以用 | 链接

    public static void main11(String[] args) {
        String str1 = "1323\\2&3432&31\\32\\232";
        System.out.println(str1);
        String[] strs = str1.split("\\\\|" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "" +
                "&");
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
    }

    public static void main12(String[] args) {
        //多次分割  ---->也可以用来连字符一次分割，看业务需要  一次分割还是多次分割
        String str1 = "nmae=zhangsan&age=11";
        String[] strs1 = str1.split("&");
        for (int i = 0; i < strs1.length; i++) {
            String[] strs2 = strs1[i].split("=");
            for (int j = 0; j < strs2.length; j++) {
                System.out.println(strs2[j]);
            }
        }
    }

    public static void main13(String[] args) {
        //字符串截取
        //从哪里到哪里是左闭右开区间

        String str1 = "abcdefgssc";
        String str2 = str1.substring(2);
        String str3 = str1.substring(2,4);
        System.out.println(str2);
        System.out.println(str3);



    }

    public static void main(String[] args) {
        //删除字符串开头结尾的空格

        String str1 = "  2sccc  cadaa  ";
        System.out.println(str1.trim());
    }




}
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

//字符串

//java当中有表示字符串类型的  但是C语言当中是没有的，只有字符数组或者字符指针指向字符串
//学习字符串的意义  --》考题 校招 面试
//学习一个类可以从构造方法开始学习？  类最后的目的是为了实例化对象，所以一定会调用构造方法
//直接赋值

